/*
    Copyright (C) 2010-2011 mdis
    
    This file is part of mdis.
    Written by Ketfi-Chérif Mehdi <ketficherif.mehdi@gmail.com>
    	   and Laügt Franz <znarf94@gmail.com>

    mdis is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    mdis is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with mdis.  If not, see <http://www.gnu.org/licenses/>.

*/

#ifndef _8X51_H
#define _8X51_H

#define NREGISTERS	40
#define NINSTRUCTIONS	255
#define ACC		mcu.data[0xE0]
#define PSW		mcu.data[0xD0]
#define SP		mcu.data[0x81]
#define R0		mcu.data[((PSW & 0x18)>>3)*8]
#define R1		mcu.data[(((PSW & 0x18)>>3)*8)+1]
#define R2		mcu.data[(((PSW & 0x18)>>3)*8)+2]
#define R3		mcu.data[(((PSW & 0x18)>>3)*8)+3]
#define R4		mcu.data[(((PSW & 0x18)>>3)*8)+4]
#define R5		mcu.data[(((PSW & 0x18)>>3)*8)+5]
#define R6		mcu.data[(((PSW & 0x18)>>3)*8)+6]
#define R7		mcu.data[(((PSW & 0x18)>>3)*8)+7]
#define GETBIT(addr)	(((addr & 0x80) == 0) ? ((mcu.data[((addr / 8) + 0x20)] & (1 << (addr % 8))) >> (addr % 8)) : ((mcu.data[addr & 0xF8] & (1 << (addr % 8))) >> (addr % 8)))
#define SETBIT(addr)	(((addr & 0x80) == 0) ? (mcu.data[((addr / 8) + 0x20)] |= (1 << (addr % 8))) : (mcu.data[addr & 0xF8] |= (1 << (addr % 8))))
#define CLRBIT(addr)	(((addr & 0x80) == 0) ? (mcu.data[((addr / 8) + 0x20)] &= ~(1 << (addr % 8))) : (mcu.data[addr & 0xF8] &= ~(1 << (addr % 8))))
#define CY		0xD7
#define AC		0xD6
#define OV		0xD2
#define P		0xD0
#define DPTR		((mcu.data[0x83]<<8) + mcu.data[0x82])
#define DPH		mcu.data[0x83]
#define DPL		mcu.data[0x82]
#define P0		mcu.data[0x80]
#define P1		mcu.data[0x90]
#define P2		mcu.data[0xA0]
#define P3		mcu.data[0xB0]
#define P4		mcu.data[0xC0]
#define P5		mcu.data[0xC4]
#define CHECKPARITY()	((((ACC & 0x01) + ((ACC & 0x02) >> 1) + ((ACC & 0x04) >> 2) + ((ACC & 0x08) >> 3) + ((ACC & 0x10) >> 4) + ((ACC & 0x20) >> 5) + ((ACC & 0x40) >> 6) + ((ACC & 0x80) >> 7)) & 0x01) == 1) ? SETBIT(P) : CLRBIT(P);
#define TMOD		mcu.data[0x89]
#define TCON		mcu.data[0x88]
#define TL0		mcu.data[0x8A]
#define TH0		mcu.data[0x8C]
#define TL1		mcu.data[0x8B]
#define TH1		mcu.data[0x8D]
#define TR0		0x8C
#define TF0		0x8D
#define TR1		0x8E
#define TF1		0x8F

char device[] = "8051";

char * const register_name[] = {
	"R0" , "R1" , "R2" , "R3" , "R4" , "R5" , "R6" , "R7" ,
	"A" , "AUXR" , "AUXR1" , "B" , "DPH" , "DPL" , "IE" , "IP" ,
	"IPH" , "P0" , "P1" , "P2" , "P3" , "P4" , "PCON" , "PSW" , "RCAP2H" ,
	"RCAP2L" , "SADDR" , "SADEN" , "SBUF" , "SCON" , "SP" , "TCON" ,
	"T2CON" , "T2MOD" , "TH0" , "TH1" , "TH2" , "TL0" , "TL1" , "TL2" ,
	"TMOD"
};

uint16_t registers_mmap[] = {
	0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
	0xE0 , 0x8E , 0xA2 , 0xF0 , 0x83 , 0x82 , 0xA8 ,
	0xB8 , 0xB7 , 0x80 , 0x90 , 0xA0 , 0xB0 , 0x87 ,
	0xD0 , 0xCB , 0xCA , 0xA9 , 0xB9 , 0x99 , 0x98 ,
	0x81 , 0x88 , 0xC8 , 0xC9 , 0x8C , 0x8D , 0xCD ,
	0x8A , 0x8B , 0xCC , 0x89
};

sfr_t sfrs[] = {
	{ "P0" , 0x80 } ,
	{ "P1" , 0x90 } ,
	{ "P2" , 0xA0 } ,
	{ "P3" , 0xB0 } ,
	{ "P4" , 0xC0 } ,
	{ "P5" , 0xC4 } ,
	{ "PSW" , 0xD0 } ,
	{ "ACC" , 0xE0 } ,
	{ "B" , 0xF0 } ,
	{ "SP" , 0x81 } ,
	{ "DPL" , 0x82 } ,
	{ "DPH" , 0x83 } ,
	{ "PCON" , 0x87 } ,
	{ "TCON" , 0x88 } ,
	{ "TMOD" , 0x89 } ,
	{ "TL0" , 0x8A } ,
	{ "TL1" , 0x8B } ,
	{ "TH0" , 0x8C } ,
	{ "TH1" , 0x8D } ,
	{ "IEN0" , 0xA8 } ,
	{ "IEN1" , 0xE8 } ,
	{ "IP0" , 0xB8 } ,
	{ "IP1" , 0xF8 } ,
	{ "S0CON" , 0x98 } ,
	{ "S0BUF" , 0x99 } ,
	{ "CML0" , 0xA9 } ,
	{ "CML1" , 0xAA } ,
	{ "CML2" , 0xAB } ,
	{ "CTL0" , 0xAC } ,
	{ "CTL1" , 0xAD } ,
	{ "CTL2" , 0xAE } ,
	{ "CTL3" , 0xAF } ,
	{ "ADCON" , 0xC5 } ,
	{ "ADCH" , 0xC6 } ,
	{ "TM2IR" , 0xC8 } ,
	{ "CMH0" , 0xC9 } ,
	{ "CMH1" , 0xCA } ,
	{ "CMH2" , 0xCB } ,
	{ "CTH0" , 0xCC } ,
	{ "CTH1" , 0xCD } ,
	{ "CTH2" , 0xCE } ,
	{ "CTH3" , 0xCF } ,
	{ "S1CON" , 0xD8 } ,
	{ "S1STA" , 0xD9 } ,
	{ "S1DAT" , 0xDA } ,
	{ "S1ADR" , 0xDB } ,
	{ "TM2CON" , 0xEA } ,
	{ "CTCON" , 0xEB } ,
	{ "TML2" , 0xEC } ,
	{ "TMH2" , 0xED } ,
	{ "STE" , 0xEE } ,
	{ "RTE" , 0xEF } ,
	{ "PWM0" , 0xFC } ,
	{ "PWM1" , 0xFD } ,
	{ "PWMP" , 0xFE } ,
	{ "T3" , 0xFF }
};

sbit_t sbits[] = {
	{ "CY"	, 0xD7 } ,
	{ "AC"	, 0xD6 } ,
	{ "F0"	, 0xD5 } ,
	{ "RS1"	, 0xD4 } ,
	{ "RS0"	, 0xD3 } ,
	{ "OV"	, 0xD2 } ,
	{ "P"	, 0xD0 } ,
	{ "TF1"	, 0x8F } ,
	{ "TR1"	, 0x8E } ,
	{ "TF0"	, 0x8D } ,
	{ "TR0"	, 0x8C } ,
	{ "IE1"	, 0x8B } ,
	{ "IT1"	, 0x8A } ,
	{ "IE0"	, 0x89 } ,
	{ "IT0"	, 0x88 } ,
	{ "EA"	, 0xAF } ,
	{ "EAD"	, 0xAE } ,
	{ "ES1"	, 0xAD } ,
	{ "ES0"	, 0xAC } ,
	{ "ET1"	, 0xAB } ,
	{ "EX1"	, 0xAA } ,
	{ "ET0"	, 0xA9 } ,
	{ "EX0"	, 0xA8 } ,
	{ "ET2"	, 0xEF } ,
	{ "ECM2"	, 0xEE } ,
	{ "ECM1"	, 0xED } ,
	{ "ECM0"	, 0xEC } ,
	{ "ECT3"	, 0xEB } ,
	{ "ECT2"	, 0xEA } ,
	{ "ECT1"	, 0xE9 } ,
	{ "ECT0"	, 0xE8 } ,
	{ "PAD"	, 0xBE } ,
	{ "PS1"	, 0xBD } ,
	{ "PS0"	, 0xBC } ,
	{ "PT1"	, 0xBB } ,
	{ "PX1"	, 0xBA } ,
	{ "PT0"	, 0xB9 } ,
	{ "PX0"	, 0xB8 } ,
	{ "PT2"	, 0xFF } ,
	{ "PCM2"	, 0xFE } ,
	{ "PCM1"	, 0xFD } ,
	{ "PCM0"	, 0xFC } ,
	{ "PCT3"	, 0xFB } ,
	{ "PCT2"	, 0xFA } ,
	{ "PCT1"	, 0xF9 } ,
	{ "PCT0"	, 0xF8 } ,
	{ "SDA"	, 0x97 } ,
	{ "SCL"	, 0x96 } ,
	{ "RT2"	, 0x95 } ,
	{ "T2"	, 0x94 } ,
	{ "CT3I"	, 0x93 } ,
	{ "CT2I"	, 0x92 } ,
	{ "CT1I"	, 0x91 } ,
	{ "CT0I"	, 0x90 } ,
	{ "RD"	, 0xB7 } ,
	{ "WR"	, 0xB6 } ,
	{ "T1"	, 0xB5 } ,
	{ "T0"	, 0xB4 } ,
	{ "INT1"	, 0xB3 } ,
	{ "INT0"	, 0xB2 } ,
	{ "TXD"	, 0xB1 } ,
	{ "RXD"	, 0xB0 } ,
	{ "CMT1"	, 0xC7 } ,
	{ "CMT0"	, 0xC6 } ,
	{ "CMSR5"	, 0xC5 } ,
	{ "CMSR4"	, 0xC4 } ,
	{ "CMSR3"	, 0xC3 } ,
	{ "CMSR2"	, 0xC2 } ,
	{ "CMSR1"	, 0xC1 } ,
	{ "CMSR0"	, 0xC0 } ,
	{ "SM0"	, 0x9F } ,
	{ "SM1"	, 0x9E } ,
	{ "SM2"	, 0x9D } ,
	{ "REN"	, 0x9C } ,
	{ "TB8"	, 0x9B } ,
	{ "RB8"	, 0x9A } ,
	{ "TI"	, 0x99 } ,
	{ "RI"	, 0x98 } ,
	{ "T2OV"	, 0xCF } ,
	{ "CMI2"	, 0xCE } ,
	{ "CMI1"	, 0xCD } ,
	{ "CMI0"	, 0xCC } ,
	{ "CTI3"	, 0xCB } ,
	{ "CTI2"	, 0xCA } ,
	{ "CTI1"	, 0xC9 } ,
	{ "CTI0"	, 0xC8 } ,
	{ "CR0"	, 0xD8 } ,
	{ "CR1"	, 0xD9 } ,
	{ "AA"	, 0xDA } ,
	{ "SI"	, 0xDB } ,
	{ "STO"	, 0xDC } ,
	{ "STA"	, 0xDD } ,
	{ "ENS1"	, 0xDE }
};

instruction_t inst[] = {
	{ "nop"				, 0x00 , 0 , NONE , NONE , NONE , 1 } ,
	{ "ajmp %02Xh"			, 0x01 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ljmp %02X%02Xh"		, 0x02 , 1 , WORD , ADDR , NONE , 2 } ,
	{ "rr A"			, 0x03 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc A"			, 0x04 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc %02Xh"			, 0x05 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "inc @R0"			, 0x06 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc @R1"			, 0x07 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R0"			, 0x08 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R1"			, 0x09 , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R2"			, 0x0A , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R3"			, 0x0B , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R4"			, 0x0C , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R5"			, 0x0D , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R6"			, 0x0E , 0 , NONE , NONE , NONE , 1 } ,
	{ "inc R7"			, 0x0F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jbc %02Xh, %02Xh"		, 0x10 , 2 , BYTE , BIT  , ADDR , 2 } ,
	{ "acall %02Xh"			, 0x11 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "lcall %02X%02Xh"		, 0x12 , 1 , WORD , ADDR , NONE , 2 } ,
	{ "rrc A"			, 0x13 , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec A"			, 0x14 , 0 , NONE , NONE , NONE , 1 } , 
	{ "dec %02Xh"			, 0x15 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "dec @R0"			, 0x16 , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec @R1"			, 0x17 , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R0"			, 0x18 , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R1"			, 0x19 , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R2"			, 0x1A , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R3"			, 0x1B , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R4"			, 0x1C , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R5"			, 0x1D , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R6"			, 0x1E , 0 , NONE , NONE , NONE , 1 } ,
	{ "dec R7"			, 0x1F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jb %02Xh, %02Xh"		, 0x20 , 2 , BYTE , BIT  , ADDR , 2 } ,
	{ "ajmp %02Xh"			, 0x21 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ret"				, 0x22 , 0 , NONE , NONE , NONE , 2 } ,
	{ "rl A"			, 0x23 , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, #%02Xh"		, 0x24 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "add A, %02Xh"		, 0x25 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "add A, @R0" 			, 0x26 , 0 , BYTE , NONE , NONE , 1 } ,
	{ "add A, @R1"			, 0x27 , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R0"			, 0x28 , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R1"			, 0x29 , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R2"			, 0x2A , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R3"			, 0x2B , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R4"			, 0x2C , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R5"			, 0x2D , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R6"			, 0x2E , 0 , NONE , NONE , NONE , 1 } ,
	{ "add A, R7"			, 0x2F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jnb %02Xh, %02Xh"		, 0x30 , 2 , BYTE , BIT  , ADDR , 2 } ,
	{ "acall %02Xh"			, 0x31 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "reti"			, 0x32 , 0 , NONE , NONE , NONE , 2 } ,
	{ "rlc A"			, 0x33 , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, #%02Xh"		, 0x34 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "addc A, %02Xh"		, 0x35 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "addc A, @R0"			, 0x36 , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, @R1"			, 0x37 , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R0"			, 0x38 , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R1"			, 0x39 , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R2"			, 0x3A , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R3"			, 0x3B , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R4"			, 0x3C , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R5"			, 0x3D , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R6"			, 0x3E , 0 , NONE , NONE , NONE , 1 } ,
	{ "addc A, R7"			, 0x3F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jc %02Xh"			, 0x40 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0x41 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "orl %02Xh, A"		, 0x42 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "orl %02Xh, #%02Xh"		, 0x43 , 2 , BYTE , ADDR , DATA , 2 } ,
	{ "orl A, #%02Xh"		, 0x44 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "orl A, %02Xh"		, 0x45 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "orl A, @R0"			, 0x46 , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, @R1"			, 0x47 , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R0"			, 0x48 , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R1"			, 0x49 , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R2"			, 0x4A , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R3"			, 0x4B , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R4"			, 0x4C , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R5"			, 0x4D , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R6"			, 0x4E , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl A, R7"			, 0x4F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jnc %02Xh"			, 0x50 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "acall %02Xh"			, 0x51 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "anl %02Xh, A"		, 0x52 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "anl %02Xh, #%02Xh"		, 0x53 , 2 , BYTE , ADDR , DATA , 2 } ,
	{ "anl A, #%02Xh"		, 0x54 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "anl A, %02Xh"		, 0x55 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "anl A, @R0"			, 0x56 , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, @R1"			, 0x57 , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R0"			, 0x58 , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R1"			, 0x59 , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R2"			, 0x5A , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R3"			, 0x5B , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R4"			, 0x5C , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R5"			, 0x5D , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R6"			, 0x5E , 0 , NONE , NONE , NONE , 1 } ,
	{ "anl A, R7"			, 0x5F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jz %02Xh"			, 0x60 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0x61 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "xrl %02Xh, A"		, 0x62 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "xrl %02Xh, #%02Xh"		, 0x63 , 2 , BYTE , ADDR , DATA , 2 } ,
	{ "xrl A, #%02Xh"		, 0x64 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "xrl A, %02Xh"		, 0x65 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "xrl A, @R0"			, 0x66 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, @R1"			, 0x67 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R0"			, 0x68 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R1"			, 0x69 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R2"			, 0x6A , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R3"			, 0x6B , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R4"			, 0x6C , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R5"			, 0x6D , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R6"			, 0x6E , 0 , NONE , NONE , NONE , 1 } ,
	{ "xrl A, R7"			, 0x6F , 0 , NONE , NONE , NONE , 1 } ,
	{ "jnz %02Xh"			, 0x70 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "acall %02Xh"			, 0x71 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "orl C, %02Xh"		, 0x72 , 1 , BYTE , BIT  , NONE , 2 } ,
	{ "jmp @A+DPTR"			, 0x73 , 0 , NONE , NONE , NONE , 2 } ,
	{ "mov A, #%02Xh"		, 0x74 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov %02Xh, #%02Xh"		, 0x75 , 2 , BYTE , ADDR , DATA , 2 } ,
	{ "mov @R0, #%02Xh"		, 0x76 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov @R1, #%02Xh"		, 0x77 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R0, #%02Xh"		, 0x78 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R1, #%02Xh"		, 0x79 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R2, #%02Xh"		, 0x7A , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R3, #%02Xh"		, 0x7B , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R4, #%02Xh"		, 0x7C , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R5, #%02Xh"		, 0x7D , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R6, #%02Xh"		, 0x7E , 1 , BYTE , DATA , NONE , 1 } ,
	{ "mov R7, #%02Xh"		, 0x7F , 1 , BYTE , DATA , NONE , 1 } ,
	{ "sjmp %02Xh"			, 0x80 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0x81 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "anl C, %02Xh"		, 0x82 , 1 , BYTE , BIT  , NONE , 2 } ,
	{ "movc @A+PC"			, 0x83 , 0 , NONE , NONE , NONE , 2 } ,
	{ "div	AB"			, 0x84 , 0 , NONE , NONE , NONE , 4 } ,
	{ "mov %02Xh, %02Xh"		, 0x85 , 2 , BYTE , ADDR , DATA , 2 } ,
	{ "mov %02Xh, @R0"		, 0x86 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, @R1"		, 0x87 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R0"		, 0x88 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R1"		, 0x89 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R2"		, 0x8A , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R3"		, 0x8B , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R4"		, 0x8C , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R5"		, 0x8D , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R6"		, 0x8E , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, R7"		, 0x8F , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov DPTR, #%02X%02Xh"	, 0x90 , 2 , WORD , ADDR , NONE , 2 } ,
	{ "acall %02Xh"			, 0x91 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov %02Xh, C"		, 0x92 , 1 , BYTE , BIT  , NONE , 2 } ,
	{ "movc A,@A+DPTR"		, 0x93 , 0 , NONE , NONE , NONE , 2 } ,
	{ "subb A, #%02Xh"		, 0x94 , 1 , BYTE , DATA , NONE , 1 } ,
	{ "subb A, %02Xh"		, 0x95 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "subb A, @R0"			, 0x96 , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, @R1"			, 0x97 , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R0"			, 0x98 , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R1"			, 0x99 , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R2"			, 0x9A , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R3"			, 0x9B , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R4"			, 0x9C , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R5"			, 0x9D , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R6"			, 0x9E , 0 , NONE , NONE , NONE , 1 } ,
	{ "subb A, R7"			, 0x9F , 0 , NONE , NONE , NONE , 1 } ,
	{ "orl C, /%02Xh"		, 0xA0 , 1 , BYTE , BIT  , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0xA1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov C, %02Xh"		, 0xA2 , 1 , BYTE , BIT  , NONE , 1 } ,
	{ "inc DPTR"			, 0xA3 , 0 , NONE , NONE , NONE , 2 } ,
	{ "mul AB"			, 0xA4 , 0 , NONE , NONE , NONE , 4 } ,
	{ "! reserved !"		, 0xA5 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov @R0, %02Xh"		, 0xA6 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov @R1, %02Xh"		, 0xA7 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R0, %02Xh"		, 0xA8 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R1, %02Xh"		, 0xA9 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R2, %02Xh"		, 0xAA , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R3, %02Xh"		, 0xAB , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R4, %02Xh"		, 0xAC , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R5, %02Xh"		, 0xAD , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R6, %02Xh"		, 0xAE , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "mov R7, %02Xh"		, 0xAF , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "anl C, /%02Xh"		, 0xB0 , 1 , BYTE , BIT  , NONE , 2 } ,
	{ "acall %02Xh"			, 0xB1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "cpl %02Xh"			, 0xB2 , 1 , BYTE , BIT  , NONE , 1 } ,
	{ "cpl C"			, 0xB3 , 0 , NONE , NONE , NONE , 1 } ,
	{ "cjne A, #%02Xh, %02Xh"	, 0xB4 , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne A, %02Xh, %02Xh"	, 0xB5 , 2 , BYTE , ADDR , ADDR , 2 } ,
	{ "cjne @R0, #%02Xh, %02Xh"	, 0xB6 , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne @R1, #%02Xh, %02Xh"	, 0xB7 , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R0, #%02Xh, %02Xh"	, 0xB8 , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R1, #%02Xh, %02Xh"	, 0xB9 , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R2, #%02Xh, %02Xh"	, 0xBA , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R3, #%02Xh, %02Xh"	, 0xBB , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R4, #%02Xh, %02Xh"	, 0xBC , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R5, #%02Xh, %02Xh"	, 0xBD , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R6, #%02Xh, %02Xh"	, 0xBE , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "cjne R7, #%02Xh, %02Xh"	, 0xBF , 2 , BYTE , DATA , ADDR , 2 } ,
	{ "push %02Xh"			, 0xC0 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0xC1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "clr %02Xh"			, 0xC2 , 1 , BYTE , BIT  , NONE , 1 } ,
	{ "clr C"			, 0xC3 , 0 , NONE , NONE , NONE , 1 } ,
	{ "swap A"			, 0xC4 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, %02Xh"		, 0xC5 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "xch A, @R0"			, 0xC6 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, @R1"			, 0xC7 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R0"			, 0xC8 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R1"			, 0xC9 , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R2"			, 0xCA , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R3"			, 0xCB , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R4"			, 0xCC , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R5"			, 0xCD , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R6"			, 0xCE , 0 , NONE , NONE , NONE , 1 } ,
	{ "xch A, R7"			, 0xCF , 0 , NONE , NONE , NONE , 1 } ,
	{ "pop %02Xh"			, 0xD0 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "acall %02Xh"			, 0xD1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "setb %02Xh"			, 0xD2 , 1 , BYTE , BIT  , NONE , 1 } ,
	{ "setb C"			, 0xD3 , 0 , NONE , NONE , NONE , 1 } ,
	{ "da A"			, 0xD4 , 0 , NONE , NONE , NONE , 1 } ,
	{ "djnz %02Xh, %02Xh"		, 0xD5 , 2 , BYTE , ADDR , ADDR , 2 } ,
	{ "xchd A, @R0"			, 0xD6 , 1 , BYTE , NONE , NONE , 1 } ,
	{ "xchd A, @R1"			, 0xD7 , 1 , BYTE , NONE , NONE , 1 } ,
	{ "djnz R0, %02Xh"		, 0xD8 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R1, %02Xh"		, 0xD9 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R2, %02Xh"		, 0xDA , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R3, %02Xh"		, 0xDB , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R4, %02Xh"		, 0xDC , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R5, %02Xh"		, 0xDD , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R6, %02Xh"		, 0xDE , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "djnz R7, %02Xh"		, 0xDF , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "movx A, @DPTR"		, 0xE0 , 0 , NONE , NONE , NONE , 2 } ,
	{ "ajmp %02Xh"			, 0xE1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "movx A, @R0"			, 0xE2 , 0 , NONE , NONE , NONE , 2 } ,
	{ "movx A, @R1"			, 0xE3 , 0 , NONE , NONE , NONE , 2 } ,
	{ "clr A"			, 0xE4 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, %02Xh"		, 0xE5 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "mov A, @R0"			, 0xE6 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, @R1"			, 0xE7 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R0"			, 0xE8 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R1"			, 0xE9 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R2"			, 0xEA , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R3"			, 0xEB , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R4"			, 0xEC , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R5"			, 0xED , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R6"			, 0xEE , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov A, R7"			, 0xEF , 0 , NONE , NONE , NONE , 1 } ,
	{ "movx @DPTR, A"		, 0xF0 , 0 , NONE , NONE , NONE , 2 } ,
	{ "acall %02Xh"			, 0xF1 , 1 , BYTE , ADDR , NONE , 2 } ,
	{ "movx @R0, A"			, 0xF2 , 0 , NONE , NONE , NONE , 2 } ,
	{ "movx @R1, A"			, 0xF3 , 0 , NONE , NONE , NONE , 2 } ,
	{ "cpl A"			, 0xF4 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov %02Xh, A"		, 0xF5 , 1 , BYTE , ADDR , NONE , 1 } ,
	{ "mov @R0, A"			, 0xF6 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov @R1, A"			, 0xF7 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R0, A"			, 0xF8 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R1, A"			, 0xF9 , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R2, A"			, 0xFA , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R3, A"			, 0xFB , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R4, A"			, 0xFC , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R5, A"			, 0xFD , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R6, A"			, 0xFE , 0 , NONE , NONE , NONE , 1 } ,
	{ "mov R7, A"			, 0xFF , 0 , NONE , NONE , NONE , 1 }
};

simul_t mcu;

#endif

